package com.it.config;

import com.it.dao.BookDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * 自动装配
 *      Spring利用依赖注入 完成对IOC容器中哥哥组件的依赖关系赋值
 * 1 @Autowired 自动注入
 *      1 默认优先按照类型去容器中找对应的组件 getBean();
 *      2 如果找到多个相同类型的组件，再讲属性的名称作为组件的id到容器中找
 *      3 @Qualifier 使用@Qualifier指定需要装配的组件id，而不是属性名
 *      4 @Primary 让spring惊醒自动装配的时候，默认使用首选的bean
 *              也可以继续使用@Qualifier指定需要装配的bean的名字
 * 2 Spring支持使用@Resource(JSR250)和@Inject(JSR330)[Java规范的注解]
 *      @Resource：
 *          可以和@Autowired一样实现自动装配功能；默认是按照组件名称进行装配的
 *          不支持@Primary，不支持required=false
 *      @Inject:
 *          需要导入javax.inject的包，和Autowired功能一样，不支持required=false
 *  3 @Autowired：构造器、参数、方法、属性；都是从容器中获取参数组件的值
 *      1 标注在方法位置
 *      2 标注在构造器中，如果组件只有一个有参构造器，这个有参构造器的@Autowired可以省略，参数还是可以从容器中获取
 *      3 方法参数位置
 *  4 自定义组件使用Spring容器底层的一些组件（ApplicationContext，BeanFactory，xxx）
 *          实现xxxAware，在创建对象的时候，会调用接口规定的方法注入相关组件Aware
 *     把Spring底层一些组件注入到自定义的Bean中
 *     xxxAware；功能使用xxxAwareProcessor；
 *     ApplicationContextAware-->ApplicationContextAwareProcess
 *
 * @author agstar
 * @date 2019/6/16 9:56
 */
@Configuration
@ComponentScan({"com.it.controller","com.it.dao","com.it.services"})
public class MainConfigOfAutowired {

    @Primary
    @Bean("bookDao2")
    public BookDao bookDao(){
        return new BookDao("2");
    }

}
